package Day_0228.TCPIP;

/**
 * @author zxc
 * @date 2023/02/28 20:40
 **/
public class NetworkTopology {
    public static void main(String[] args) {
        /**
         * 谈一谈对于TCP/IP协议的网络拓扑图的理解
         * ===》
         * 1.主机A，判断主机F是否在同一个子网内;
         * （1）若是在用一个子网内的话，则直接查询arp缓存获取目标IP地址的MAC地址;
         * （2）若是arp缓存中不存在的话，则主机A广播发送arp请求，等待主机F的响应，同时将主机F所响应的IP地址与MAC地址之间的映射记录到drp缓存中;
         * （3）后经过交换机进行转发，查询MAC表，获取目标MAC地址所在的端口，来进行转发;
         *
         * 2.不在一个子网内的话，则选择封装数据包经由路由器进行转发给另一个子网;
         * （1）源IP地址为自身主机的IP地址，源MAC地址为自身主机的MAC地址;
         * （2）目的IP地址为 主机F的IP地址，源MAC地址为 当前子网与路由器相连端口的MAC地址;
         * （3）默认网关，即保持了 当前子网与路由器相连端口的IP地址;
         * （4）根据默认网关 && arp缓存，来获取 默认网关多对应的MAC地址;
         *
         * 3.数据包到达路由器A之后，查看路由表（路由器所维护的IP地址和MAC地址之间的映射关系）,
         * 来获取目标IP地址所对应子网在路由器中所对应的端口;
         * （1）路由表中所维护的是 路由表端口和各个子网之间的映射关系;
         * （2）若是路由器之间也要进行转发的话，
         * 则需要将数据包的数据链路层头部 根据路由表 && 路由器所维护的arp缓存，来进行重新封装并转发;
         *
         * 4.根据路由器所维护的路由表查询到 目的IP地址所对应子网的端口号，同时根据路由器所维护的arp缓存获取该端口所对应的MAC地址;
         * （1）根据目的IP地址 + 路由器所维护的arp缓存，来获取 目的IP地址所对应的目的MAC地址;
         * （2）若是arp缓存中不存在的话，则通过端口，来广播发送arp请求，来获取目标IP地址所对应的目标MAC地址;
         *
         * 5.最后，到达 目的IP地址所对应子网中的交换机，
         * 根据数据包中所保存的目的MAC地址 && 该交换机所维护的MAC表（MAC地址和端口的映射），来将该数据包发送到 主机F;
         *
         * ===》
         * 总结 ：
         * （1）客户端传输HTTP请求 ：
         *  即，数据封装的过程 :
         *  1.应用层报文 -> 传输层报文 -> 网络层报文 -> 链路层报文;
         *  2.HTTP报文 -> （TCP首部 + HTTP报文） -> （IP首部 + TCP首部 + HTTP报文）
         *  -> （以太网首部 + IP首部 + TCP首部 + HTTP报文 + 以太网尾部）
         *
         * （2）服务端应用 ：
         *  即，数据分用的过程 ：
         *  1.链路层报文 -> 网络层报文 -> 传输层报文 -> 应用层报文;
         *  2.（以太网首部 + IP首部 + TCP首部 + HTTP报文 + 以太网尾部） -> （IP首部 + TCP首部 + HTTP报文）
         *   -> （TCP首部 + HTTP报文） -> HTTP报文;
         */
    }
}
